<?php 
/**
 * @Name ActionPlug 
 * @Title 行为挂载插件控制器 
 * @Extends app\admin\controller\AdminCore 
 * @Modifiers public
 * @Auth Ghj<912524639@qq.com> 
 * @Time 2018年08月28日 
 * @Site http:// www.thinkgms.com/ 
 */
namespace app\admin\controller;
use app\admin\controller\AdminCore;

class ActionPlug extends AdminCore{

	//当前控制器的模型
	protected $Model;
	
	//当前控制器的数据表
	protected $Db;
	
	//当前控制器的验证器
	protected $Validate;
	
	//当前控制器的主键
	protected $Pk='id';
	
	//新增预设数据
	protected $DataPre = [
		'id'=>'',
		'action_id'=>'',
		'plug_id'=>'',
		'status'=>'1',
	];
	
	/**
	 * @Name initialize
	 * @Title 初始化方法
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月28日 
	 * @Site http:// www.thinkgms.com/
	 */
    public function initialize()
    {
        // 继承父模型的初始化方
		parent::initialize ();
		$this->Validate	= validate ('app\admin\validate\ActionPlug');
		$this->Model	= model('app\admin\model\ActionPlug');
		$this->Db		= db('ActionPlug');
    }

	/**
	 * @Name index
	 * @Title 首页
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月28日 
	 */
	public function index() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取请求数据
			$Parm = input ( 'post.' );
			// 调用_Serch方法获取 查询条件
			$Map = [];
			$Map['action_id'] = input('action_id',0);
			// 获取符合条件的数据总数
			$Total = $this->Model->where ( $Map )->count ();
			// 判断数据总数是否为0
			if ($Total == 0) {
				// 防止显示异常 将$List设置为''
				$List = '';
			} else {
				// 调用_ExtSort函数获取 排序条件
				$Sort = _ExtSort ( $Parm ['sort'] );
				// 查询符合条件的数据
				$List = db('ActionPlug')->alias('ap')->where ( $Map )->limit ( $Parm ['start'] . ',' . $Parm ['limit'] )->join('plug p','ap.plug_id = p.id')->field('ap.id,ap.plug_id,ap.action_id,ap.func,p.name')->order ( $Sort )->select();
				foreach($List as $K => $V){
					//设置当前插件的配置路径
					$_CPath = PLUG_PATH .  $V['name'] . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config.php';
					//如果配置不存在，则返回错误
					if (!file_exists($_CPath)) {
						continue;
					}
					//引入配置文件
					$_Conf = [];
					$_Conf = require($_CPath);
					if(array_key_exists('setting',$_Conf)){
						$IsConf = 1;
					}else{
						$IsConf = 0;
					}
					$List[$K]['is_conf']=$IsConf;
				}
			}
			// 封装返回数据
			$Res = ['total' => $Total,'rows' => $List];
			// 返回json数据
			return json ( $Res );
		} else {
			// 返回视图
			return view ();
		}
	}
	
	/**
	 * @Name add
	 * @Title 新增
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月28日 
	 */
	public function add() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取POST数据
			$Parm = input ( 'post.' );
			// 验证数据 场景为add
			if ($this->Validate->scene ( 'add' )->check ( $Parm )) {
				// 数据写入 验证字段为数据库内字段 写入类型为新增
				$Result = $this->Model->allowField ( true )->isUpdate ( false )->save ( $Parm );
				// 判断执行结果
				if ($Result) {
					// 返回成功
					return _Code ( '200', '成功' );
				} else {
					// 返回失败
					$_Err = $this->Model->getError ();
					return _Code ( '201', $_Err ? $_Err : '失败' );
				}
			} else {
				// 验证失败 获取验证器的错误信息
				$_Err = $this->Validate->getError ();
				// 返回错误信息 如果没有错误信息 默认返回
				return _Code ( '301', $_Err ? $_Err : '数据验证失败' );
			}
		} else {
			$this->DataPre['action_id'] = input ( 'action_id', '' );
			return _Code ( '200', '成功', $this->DataPre );
		}
	}
	
	/**
	 * @Name edit
	 * @Title 更新
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月28日 
	 */
	public function edit() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取POST数据
			$Parm = input ( 'post.' );
			if(!array_key_exists($this->Pk,$Parm)){
				// 参数异常 返回错误信息
				return _Code ( '101', '参数异常 主键不存在' );
			}
			// 验证数据 场景为edit
			if ($this->Validate->scene ( 'edit' )->check ( $Parm )) {
				// 数据写入 验证字段为数据库内字段 写入类型为更新
				$Result = $this->Model->allowField ( true )->isUpdate ( true )->save ( $Parm, [ $this->Pk => $Parm[$this->Pk] ]);
				// 判断执行结果
				if ($Result) {
					// 返回成功
					return _Code ( '200', '成功' );
				} else {
					// 返回失败
					$_Err = $this->Model->getError ();
					return _Code ( '201', $_Err ? $_Err : '失败' );
				}
			} else {
				// 验证失败 获取验证器的错误信息
				$_Err = $this->Validate->getError ();
				// 返回错误信息 如果没有错误信息 默认返回
				return _Code ( '301', $_Err ? $_Err : '数据验证失败' );
			}
		} else {
			// 获取请求ID
			$ParmID = input ( $this->Pk, '' );
			// 验证参数
			if ($ParmID == '') {
				// 参数异常 返回错误信息
				return _Code ( '101', '参数异常 主键不存在' );
			}
			// 读取数据
			$Result = $this->Model->where ( [ $this->Pk => $ParmID ] )->find ();
			// 判断数据是否正确
			if (! $Result) {
				// 返回错误信息
				return _Code ( '201', '数据不存在' );
			}
			// 返回json数据
			return _Code ( '200', '成功', $Result );
		}
	}
	
	/**
	 * @Name del
	 * @Title 删除
	 * @Modifiers public
	 * @Auth Ghj<912524639@qq.com>
	 * @Time 2018年08月28日 
	 */
	public function del() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取请求ID
			$ParmID = input ( $this->Pk, '' );
			// 验证参数
			if ($ParmID == '') {
				// 参数异常 返回错误信息
				return _Code ( '101', '参数异常 主键不存在' );
			}
			// 拆分字符串 因为前台可能会删除多条数据
			$ParmID = explode ( ',', $ParmID );
			// 删除数据
			$Result = $this->Model->destroy ( $ParmID );
			// 判断执行结果
			if ($Result) {
				// 返回成功
				return _Code ( '200', '成功' );
			} else {
				// 返回失败
				$_Err = $this->Model->getError ();
				return _Code ( '201', $_Err ? $_Err : '失败' );
			}
		}
	}

	/**
	 * 配置设置
	 */
	public function setting() {
		// 判断请求类型
		if ($this->request->isPost ()) {
			// 获取POST数据
			$_Post = input ( 'post.' );
			// 获取数据主键 防止通过GET方式传递逐渐
			$Parm = [];
			$Parm[$this->Pk] = input ( 'setting_key_id', '' );
			// 验证参数
			if ($Parm[$this->Pk] == '') {
				// 参数异常 返回错误信息
				return _Code ( '101', '参数错误' );
			}
			unset($_Post['setting_key_id']);
			$Parm['setting'] = serialize($_Post);
			// 数据写入 验证字段为数据库内字段 写入类型为更新
			$Result = $this->Model->allowField ( true )->isUpdate ( true )->save ( $Parm, [ $this->Pk => $Parm[$this->Pk] ]);
			// 判断执行结果
			if ($Result) {
				// 返回成功
				return _Code ( '200', '成功' );
			} else {
				// 返回失败
				$_Err = $this->Model->getError ();
				
			}
		} else {
			// 获取参数
			$_ID	= input ( 'id', '' );
			$Ext	= input ( 'ext', '' );
			if ($Ext == 'js') {
				// 读取模版文件
				$_CPath = PLUG_PATH.  $_ID . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'setting.html';
				//如果配置不存在，则返回错误
				if (!file_exists($_CPath)) {
					return _Code ( '201', '配置模版不存在' );
				}
				
				return _Code ( '200', '成功','['.$this->fetch($_CPath).",{xtype:'hiddenfield',name: 'setting_key_id'}]");
			}else{
				// 验证参数
				if ($_ID == '') {return _Code ( '101', '参数错误' );}
				// 读取数据
				$_Data = $this->Model->where ( [ 'id' => $_ID ] )->find ();
				// 判断数据是否正确
				if (! $_Data) {
					// 返回错误信息
					return _Code ( '201', '数据不存在' );
				}
				$_Setting = unserialize($_Data['setting']);
				$_Setting['setting_key_id'] = $_ID;
				// 返回json数据
				return _Code ( '200', '成功', $_Setting );
			}
		}
	}
}